# -*- encoding: utf-8 -*-
# -*- coding: utf-8 -*-

'''
@author: 5822 - Duarte Marques & 5955 - João Rosa
@date: 05 de Novembro de 2012
@obs: Trabalho de Linguagens de Programação em Python
      Docente: Prof. Jasnau Caeiro
'''

import xlrd
import sqlite3
from sqlalchemy import *
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class Inscritos(Base):
    '''
    Classe que contêm a tabela e os seus campos para serem introduzidos 
    na base de dados.
    
    @param Base: este parametro contêm o "declarative_base()" que é 
                 um atributo do sqlalchemy
    '''
    
    __tablename__ = "inscritos"
 
    id              = Column(Integer, primary_key=True)
    estabelecimento = Column(String)
    unidade         = Column(String)
    nivelformacao   = Column(String)
    curso           = Column(String)
    area            = Column(String)
    ano95_96        = Column(Integer)
    ano96_97        = Column(Integer)
    ano97_98        = Column(Integer)
    ano98_99        = Column(Integer)
    ano99_00        = Column(Integer)
    ano00_01        = Column(Integer)
    ano01_02        = Column(Integer)
    ano02_03        = Column(Integer)
    ano03_04        = Column(Integer)
    ano04_05        = Column(Integer)
    ano05_06        = Column(Integer)
    ano06_07        = Column(Integer)
    ano07_08        = Column(Integer)
    ano08_09        = Column(Integer)
    ano09_10        = Column(Integer)
    ano10_11        = Column(Integer)
 
    def __init__(self, estabelecimento, unidade, nivelformacao, curso, area,
                    ano95_96, ano96_97, ano97_98, ano98_99, ano99_00,
                    ano00_01, ano01_02, ano02_03, ano03_04, ano04_05,
                    ano05_06, ano06_07, ano07_08, ano08_09, ano09_10,
                    ano10_11):
        '''Constructor'''
        self.estabelecimento = estabelecimento
        self.unidade = unidade
        self.nivelformacao = nivelformacao
        self.curso = curso
        self.area = area
        self.ano95_96 = ano95_96
        self.ano96_97 = ano96_97
        self.ano97_98 = ano97_98
        self.ano98_99 = ano98_99
        self.ano99_00 = ano99_00
        self.ano00_01 = ano00_01
        self.ano01_02 = ano01_02
        self.ano02_03 = ano02_03
        self.ano03_04 = ano03_04
        self.ano04_05 = ano04_05
        self.ano05_06 = ano05_06
        self.ano06_07 = ano06_07
        self.ano07_08 = ano07_08
        self.ano08_09 = ano08_09
        self.ano09_10 = ano09_10
        self.ano10_11 = ano10_11   
    pass


class Basedados:
    '''
    Classe que contêm todos os métodos que vão dar origem à base de dados 
    em sqlalchemy, com os dados introduzidos.
    '''
    
    def criarbd(self):
        '''
        Neste método vamos criar a base de dados e returna-la.
        O "echo=True" serve para mostrar as informações relativas 
        à base de dados na inserção dos dados.
        '''
        db = create_engine('sqlite:///Inscritos_2010-2011.db', echo=False)
        Base.metadata.drop_all(db)
        metadata = Base.metadata
        metadata.create_all(db)
        return db
    
    def abrirexcel(self):
        '''
        Neste método vamos abrir o livro Excel e depois vamos para a página "Tabela 4.1".
        '''
        book = xlrd.open_workbook("Inscritos_2010-2011.xls")
        view = book.sheet_by_name(u'Tabela 4.1')
        return view
    
    
    def inserirdados(self, db, view):
        '''
        Neste método vamos inserir os dados do Excel na base de dados.
        
        @param db: este parametro é o que é retornado da criação da base de dados
        
        @param view: este parametro é o que é retornado do abrir excel que 
                     vai abrir o ficheiro .XLS e ir para o separador 4.1
        '''
        Session = sessionmaker(bind = db)
        session = Session()
        
        estabelecimento = ''
        unidade = ''
        nivelformacao = ''

        for i in xrange(4,11956):#for que percorre todo o ficheiro xls
            
            if view.cell_value(i,0) != "":
                estabelecimento = view.cell(i,0).value
            else:
                estabelecimento = estabelecimento
        
            if view.cell_value(i,1) != "":
                unidade = view.cell(i,1).value
            else:
                unidade = unidade
            
            if view.cell_value(i,2) != "":
                nivelformacao = view.cell(i,2).value
            else:
                nivelformacao = nivelformacao
            
            curso = view.cell(i,3).value
            area = view.cell(i,4).value
            ano95_96 = view.cell(i,7).value
            ano96_97 = view.cell(i,10).value
            ano97_98 = view.cell(i,13).value
            ano98_99 = view.cell(i,16).value
            ano99_00 = view.cell(i,19).value
            ano00_01 = view.cell(i,22).value
            ano01_02 = view.cell(i,25).value
            ano02_03 = view.cell(i,28).value
            ano03_04 = view.cell(i,31).value
            ano04_05 = view.cell(i,34).value
            ano05_06 = view.cell(i,37).value
            ano06_07 = view.cell(i,40).value
            ano07_08 = view.cell(i,43).value
            ano08_09 = view.cell(i,47).value
            ano09_10 = view.cell(i,50).value
            ano10_11 = view.cell(i,53).value
            
            obj = Inscritos(estabelecimento, unidade, nivelformacao, curso, area,
                            ano95_96, ano96_97, ano97_98, ano98_99, ano99_00,
                            ano00_01, ano01_02, ano02_03, ano03_04, ano04_05,
                            ano05_06, ano06_07, ano07_08, ano08_09, ano09_10,
                            ano10_11)
            
            session.add(obj)
        session.commit()
        pass
    
    def querydados(self, db):
        '''
        Método que passa toda a informação da base de dados 
        para um lista.
        
        @param db: este parametro é o que é retornado da criação da base de dados
                   e faz a ligação com a mesma para poder passar para uma lista os dados
        '''
        
        Session = sessionmaker(bind = db)
        session = Session()
        
        dadosquery = session.query(Inscritos)
        dados = []
        
        for i in dadosquery:
            
            dados_completos = (i.estabelecimento, i.unidade, i.nivelformacao, i.curso, i.area,
                                i.ano95_96, i.ano96_97, i.ano97_98, i.ano98_99, i.ano99_00,
                                i.ano00_01, i.ano01_02, i.ano02_03, i.ano03_04, i.ano04_05,
                                i.ano05_06, i.ano06_07, i.ano07_08, i.ano08_09, i.ano09_10,
                                i.ano10_11)
            
            dados.append(dados_completos)
            pass
        return dados